home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / The Best of BMUG / Utilities / Text and Speech / Alpha.5.76 / Tcl / SystemCode / vi.tcl < prev    next >
Text File  |  1994-03-08  |  19KB  |  722 lines

  1. # Alpha 5.x Init File
  2.  
  3. # ****************************************************************************
  4. # FILE:        vi.tcl    Version 1.0
  5. # CONTENTS:    Alpha tcl startup for simple "vi" emulation.
  6. # USAGE:
  7. # REVISION HISTORY:    10/03/93:1:26AM    PHM V1.0    created
  8. # DESIGN NOTES:
  9. # TODO:
  10. # SEE ALSO:    AlphaBits.tcl, procs.tcl, vi.tcl
  11. # ***************************************************************************
  12. # AUTHOR: Peter H. Mills (phm@cs.duke.edu)
  13. # COPYRIGHT:
  14. #    Copyright © 1993 by Peter H. Mills
  15. #    All rights reserved.
  16. #
  17. #    Redistribution and use in source and binary forms are permitted
  18. #    provided that the above copyright notice and this paragraph are
  19. #    duplicated in all such forms and that any documentation,
  20. #    advertising materials, and other materials related to such
  21. #    distribution and use acknowledge that the software was developed
  22. #    by Peter H. Mills.
  23. #
  24. #    THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  25. #    IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  26. #    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  27. # ***************************************************************************
  28.  
  29. # ==========================================
  30. # ==== Vi MODE  (Vi, Insert, Ex)    ====
  31. # ==========================================
  32. #  Vi Mode:
  33. #    Variables
  34. #    Functions: Edit
  35. #    Functions: Mode
  36. #    Key Bindings: Vi, Insert, Ex Modes
  37. #===========================================
  38.  
  39. # ******************************************************************************
  40. # VI    (visual    editor --- minimal subset)   --- New section by    Peter Mills
  41. #
  42. # ALPHA (EMACS):
  43. #    SELECTION = <curPos,selEnd> = markHilite(REGION=(Mark,Insertion_point))
  44. #    Option-cut works on Selected (alpha functions work on Regions).
  45. #    Alpha: multiple    mark/clipboards, bindings, macros/built-funcs,
  46. #        reflective load, mouse ops <-> keys.
  47. # MODE FEATURES (like    unix "vi"):
  48. #    i<...> for insert mode,    ESC to get back    to vi mode.
  49. #    : for ex mode, RET to get back to vi mode.
  50. # INSERT mode:    type normally until    ESC (DEL=erase,    CR=newline).
  51. #        Inserted text saved in "viInsertText" clipboard upon ESC.
  52. #    WARNING:    insert mode    not reset current mark.
  53. # VI mode:        
  54. #    MOTION:    h,j,k,l,0,$, DEL (backward), CR    (nextline),
  55. #        ^f (nextPage), ^b (backPage), w,b,e, z    ^1 (home) ^$ (lastline)
  56. #    INSERT MODE:    c<w,$>    i   a    A   o    O   s
  57. #    EDIT TEXT:    d<w,$,d,L>  x    J   ("r" == s)    d<R=rest,B=before>    
  58. #    MARKS and SELECTION:        m (mark)    ' (goto    mark)
  59. #        NEW:    ^m,ESC (set    current    mark)    ^' (exchangePointAndMark)
  60. #            O^h    (highlight region<mark,pointer>)
  61. #            ^s : Selection <--> Region marked by <a,b> 
  62. #    CUT and    PASTE:        p (yank)    dx (cut) dc (copy) dv (paste) (maybe ^?)
  63. #    SEARCH:        / (forward)        ? (backward)    n (find next)
  64. #            ^% (balance    [matchbrace?])
  65. #    REDO COMMAND:        .    (ONLY "d" and insert-ops <c,i,A,o>)
  66. #        NEW: Will Redo last    command    above, ignores intervening history.
  67. #    UNDO:        u    (history)
  68. #    STATUS:        ^g
  69. # EX mode:
  70. #    MOTION:        1 (home)        $ (end)    g (goto    line)
  71. #    CUT and    PASTE:        x (cut)    c (copy)    v (paste)
  72. #        Named clipboards:    X (cut)    C (copy)    V (paste)
  73. #        Region marked by <a,b>: i (copy->insertion)    m (move->insertion)
  74. #    FILE and WINDOW:    q (quit)        r (read)        w (save)
  75. #        n (new win) s (save As) S (save selection) p (copy sel to new wind)
  76. # MODE SWITCH    commands:   ^z (switch from setViModeOff<-->setviModeOn)
  77. # MENU:    setViModeOff <---> setViMode
  78. #    setViMoveOff (DEL,CR edit),    setViMode
  79. # BUFFERS:    viIns (inserted)    viTmp (mark)
  80. # PROBLEMS:    r needs    ESC; x not backwards at    eol; p above line; fillcol unset
  81. # FUTURE:    use "unbind", search needs wrap_around flag, forwardWord recog()
  82. # EXTENSIONS:    binding-modes; macro-conditional/lisp; alias-functions (r);
  83. #        load/edit from clip; named-clip<->clip;    fix:macros-windows. 
  84. # SEE    ALSO:    emacs/epoch(X->mouse).
  85. # ASIDE:  Mac    user interface Open "Look and Feel" Keyboard Shortcuts (CR,ESC).
  86. # ******************************************************************************
  87.  
  88. # ==========================
  89. # ==== VARIABLES    ====
  90. # ==========================
  91. # ==== Constants ====
  92. set esc 0x35
  93. set del 0x33
  94. set cr  0x24
  95. set spc 0x31
  96. set quot 0x27
  97. if {! [info exists altesc]} { set altesc 0x35 }
  98. # ==== Redo History ====
  99. set viLastCmd ""
  100. set viInsertText ""
  101. # ==== Search Params ====
  102. set searchStr ""
  103. set searchWrap 1
  104. set forward 1
  105. set regExpr 1
  106. set ignoreCase 1
  107. set matchWords 0
  108.  
  109. # ==========================
  110. # ==== EDIT FUNCTIONS (WORD MOTION)
  111. # ==========================
  112. set viWordBreak {(([a-zA-Z0-9_]+)|([!-/:-@\[-^\`\{-~]+))}
  113. set viWordBreakPreface {([^a-zA-Z0-9_])}
  114. set viSWordBreakPreface \
  115.  {(([^a-zA-Z0-9_]([a-zA-Z0-9_]+))|([^!-/:-@\[-^\`\{-~]([!-/:-@\[-^\`\{-~]+)))}
  116. set viNonWhiteSpace {[!-~]}
  117.  
  118. proc viEndOfWord {} {
  119.     global viWordBreak
  120. #    # if {($start < [maxPos])} { incr start }
  121.     set retval [search -f 1 -n "$viWordBreak" [getPos]] 
  122.     if {($retval != "")} {
  123.         set retval [lindex $retval 1]
  124.         goto $retval }
  125. }
  126.  
  127. # # beginningOfWord
  128. proc viBackwardWord {} {
  129.     global viSWordBreakPreface
  130.     set start [getPos]
  131.     if {($start > 1)} { incr start -2 }
  132.     set retval [search -f 0 -n "$viSWordBreakPreface" $start]
  133.     if {($retval != "")} {
  134.         set retval [lindex $retval 0]
  135.         goto $retval
  136.         forwardChar }
  137. }
  138.  
  139. proc viForwardWord {} {
  140. #    # actually beginningOfWord, endOfWord below
  141. #    # forwardChar ; backwardWord ; forwardWord ; forwardWord ; backwardWord
  142.     global viSWordBreakPreface
  143.     set retval [search -f 1 -n "$viSWordBreakPreface" [getPos]] 
  144.     if {($retval != "")} {
  145.         set retval [lindex $retval 0]
  146.         goto $retval
  147.         forwardChar }
  148. }
  149.  
  150.  
  151. # ==========================
  152. # ==== EDIT FUNCTIONS    ====
  153. # ==========================
  154. proc viDeleteCharX {} {
  155.     set start [getPos]
  156.     set point_max [maxPos]
  157.     if {($start >= $point_max) || ([lookAt [getPos]] == "\n")  ||
  158.         ([lookAt [getPos]] == "\r")} { backwardChar }
  159.     deleteChar
  160. }
  161.  
  162. #    # backSpace
  163. proc viDeleteCharB {} {
  164.     backwardChar
  165.     deleteChar
  166. }
  167.  
  168. proc viDeleteCharSel {} {
  169.     if {[getPos] == [selEnd]} {
  170.         backwardChar
  171.         deleteChar
  172.     } else { deleteText [getPos] [selEnd] }
  173. }
  174.  
  175. proc viTypeSpace {} {
  176.     insertText " "
  177. }
  178.  
  179.  
  180. # PROBLEM: now works well only on delete line
  181. proc viYank {} {
  182.     global viLastCmd
  183.     set viLastCmd viYank
  184.     endOfLine
  185.     yank
  186.     beginningOfLine
  187. }
  188.  
  189.  
  190. proc viJoinLine {} {
  191.     global viLastCmd
  192.     global viNonWhiteSpace
  193.     set viLastCmd viJoinLine
  194.     createTMark "viTmp" [getPos]
  195.     endOfLine
  196.     deleteChar
  197. #    #    STRIP WHITE SPACE
  198.     set start [getPos]
  199.     set retval [search -f 1 -n "$viNonWhiteSpace" $start]
  200.     if {($retval != "")} { set retval [lindex $retval 0]
  201.     } else { set retval $start }
  202.     if {$start < $retval} { deleteText $start $retval }
  203. #
  204.     insertText " "
  205.     gotoTMark "viTmp"
  206.     removeTMark "viTmp"
  207. }
  208.  
  209. proc viOpenLine {} {
  210.     global viLastCmd
  211.     set viLastCmd viOpenLine
  212.     endOfLine
  213.     carriageReturn
  214.     viInsertMode
  215. }
  216.  
  217. proc viOpenLineB {} {
  218.     openLine
  219.     viInsertMode
  220. }
  221.  
  222. proc viDeleteLineEnd {} {
  223.     global viLastCmd
  224.     set viLastCmd viDeleteLineEnd
  225.     set start [getPos]
  226.     endOfLine
  227.     deleteText $start [getPos]
  228. }
  229.  
  230. proc viDeleteLine {} {
  231.     global viLastCmd
  232.     set viLastCmd viDeleteLine
  233. #    # nextLineStart [getPos], lineStart [getPos]
  234.     endOfLine
  235.     set end [getPos]
  236.     previousLine
  237.     endOfLine
  238.     deleteText [getPos] $end
  239.     beginningOfLine
  240.     nextLine
  241. }
  242.  
  243. proc viDeletePage {} {
  244.     global viLastCmd
  245.     set viLastCmd viDeletePage
  246.     set start [getPos]
  247.     pageForward
  248.     moveInsertionHere
  249.     deleteText $start [getPos]
  250. }
  251.  
  252. proc viDeleteRest {} {
  253.     global viLastCmd
  254.     set viLastCmd ""
  255.     set start [getPos]
  256.     endOfBuffer
  257.     deleteText $start [getPos]
  258. }
  259.  
  260. proc viDeleteAllBefore {} {
  261.     global viLastCmd
  262.     set viLastCmd ""
  263.     set end [getPos]
  264.     beginningOfBuffer
  265.     deleteText [getPos] $end
  266. }
  267.  
  268. proc viDeleteWord {} {
  269.     global viLastCmd
  270.     set viLastCmd viDeleteWord
  271.     set start [getPos]
  272.     viForwardWord
  273.     set end [getPos]
  274.     if {$start < $end} { deleteText $start $end }
  275. }
  276.  
  277. proc viAdd {} {
  278.     global viLastCmd
  279.     set viLastCmd viAdd
  280.     viForwardWord
  281.     viInsertMode
  282. }
  283.  
  284. proc viAddEnd {} {
  285.     global viLastCmd
  286.     set viLastCmd viAddEnd
  287.     endOfLine
  288.     viInsertMode
  289. }
  290.  
  291. proc viChangeLine {} {
  292.     global viLastCmd
  293.     set viLastCmd viChangeLine
  294.     set start [getPos]
  295.     endOfLine
  296. #    # deleteText $start [getPos] ; endOfLine
  297.     select $start [getPos]
  298.     viInsertMode
  299. }
  300.  
  301. proc viChangeWord {} {
  302.     global viLastCmd
  303.     set viLastCmd viChangeWord
  304.     set start [getPos]
  305.     viEndOfWord
  306. #    # deleteText $start [getPos]    (deleteWord)
  307.     select $start [getPos]
  308.     viInsertMode
  309. }
  310.  
  311. proc viSubChar {} {
  312.     global viLastCmd
  313.     set viLastCmd viSubChar
  314.     set start [getPos]
  315. #    # deleteChar
  316.     set end $start
  317.     incr end
  318.     select $start $end
  319.     viInsertMode
  320. }
  321.  
  322. # Search with Wrap (searchWrap) ; 
  323. #    Max_Position(File) = {0,[maxPos]-1}
  324. proc viSearch {} {
  325.     global searchStr
  326.     global searchWrap
  327.     global forward
  328.     set start [getPos]
  329.     set point_max [expr {[maxPos] - 1}]
  330.     if {$forward} { if {($start < $point_max)} { incr start }
  331.     } else { if {$start > 0} { incr start -1 } }
  332.     set retval [search -f $forward -n "$searchStr" $start]
  333.     if {($retval == "") && $searchWrap} {
  334.       if {$forward} { set frompos 0 } else { set frompos $point_max }
  335.       if {$forward} {
  336.         set retval [search -f $forward -n "$searchStr" -l $start $frompos] 
  337.       } else {
  338.         set retval [search -f $forward -n "$searchStr" $frompos] 
  339.         if {($retval != "") && ([lindex $retval 0] < $start)} { 
  340.         set retval ""} }
  341.     }
  342.     if {$retval == ""} { beep } else { goto [lindex $retval 0] }
  343. }
  344.  
  345. proc viSearchBackward {} {
  346.     global searchStr
  347.     global forward
  348.     if [catch { prompt "Search for: " $searchStr } retval] { return }
  349.     set forward 0
  350.     set searchStr $retval
  351.     viSearch
  352. }
  353.  
  354. proc viSearchForward {} {
  355.     global searchStr
  356.     global forward
  357. #    #    set retval [getline "Search for: " $searchStr] ;
  358. #    #    if {"" == $retval} { return }
  359.     if [catch { prompt "Search for: " $searchStr } retval] { return }
  360.     set forward 1
  361.     set searchStr $retval
  362.     viSearch
  363. }
  364.  
  365. proc viRedoSearch {} {
  366.     global forward
  367.     if {$forward} { repeatSearchForward } else { repeatSearchBackward }
  368. }
  369.  
  370.  
  371. # ===========================================================================
  372. # tabsToPrint :         ^I->\^I ; \TAB->\ ^I ; TAB->^I
  373. # printToTabs : ^i->^I ; \^I->^i ; ^I->TAB ; ^i->^I
  374. # ===========================================================================
  375.  
  376. proc viCopySelWind {} {
  377.     if {[getPos] == [selEnd]} { return }
  378.     set text [getText [getPos] [selEnd]]
  379.     new
  380.     moveInsertionHere
  381.     insertText $text
  382. }
  383. # (view named clipboard, copy and view clipboard)
  384. # ==== save selection to file ====
  385. proc viSaveSelection {} {
  386.     viCopySelWind 
  387.     saveAs
  388.     killWindow
  389. }
  390.         
  391. # ==== SAVED REGION[Mark,insert] <=> SELECTION(curPos<selEnd) ====
  392. proc viRegionAB {} {
  393.     set pos [getPos]
  394.     if {[catch { gotoTMark "a" }]} { beep ; return "" }
  395.     set start [getPos]
  396.     if {[catch { gotoTMark "b" }]} { beep ; goto $pos ; return "" }
  397.     set end [getPos]
  398.     goto $pos
  399.     if {$start > $end} { set temp $start ; set start $end ; set end $temp }
  400.     if {$start <= $end} { return "" }
  401.     return [list $start $end]
  402. }
  403.  
  404. proc viSelectToSaved {} {
  405. #    if {[getSelect] == ""} {}
  406.     if {[getPos] == [selEnd]} {
  407.         set retval [viRegionAB]
  408.         if {$retval == ""} { return }
  409.         set start [lindex $retval 0] ; set end [lindex $retval 1]
  410.         select $start $end
  411.         removeTMark "a"
  412.         removeTMark "b"
  413.     } else {
  414.         createTMark "a" [getPos]
  415.         createTMark "b" [selEnd]
  416. #        markHilite -VS- select [getPos] [getPos]
  417.     }
  418. }
  419.  
  420. #
  421. # NOTE: like drag-and-drop moving (vs. active objects)
  422. #
  423. # ==== Copy region marked by "a"-"b" to curPos
  424. proc viCopyAB {{kill 0}} {
  425.     set retval [viRegionAB]
  426.     if {$retval == ""} { return }
  427.     set start [lindex $retval 0] ; set end [lindex $retval 1]
  428.     set text [getText $start $end]
  429.     if {$kill} { deleteText $start $end }
  430.     if {[getPos] == [selEnd]} { insertText $text
  431.     } else { replaceText [getPos] [selEnd] $text }
  432. }
  433. proc viMoveAB {} { viCopyAB 1 }
  434.  
  435.  
  436. # =====================================================================
  437.  
  438. # ==========================
  439. # ==== MODE FUNCTIONS    ====
  440. # ==========================
  441.  
  442. # ==== SUBMODE (Minor Mode)
  443. #
  444. # WARNING:    viSubMode, viInsertText should be BUFFER LOCAL (curWinId)
  445. #
  446. # "subMode" from procs.tcl, *is* buffer local -- changeSubMode().
  447. #
  448.  
  449. # ==== SWITCH to VI Command Mode ====
  450. proc viCmdMode {} { changeSubMode "Vi" }
  451.  
  452. # changeMode: restores mode-local params, sets 1st time to TextModeParams
  453. proc setViMode {} {
  454.     changeMode "Vi"
  455.     uplevel #0 {
  456.         set wordBreak "$viWordBreak"
  457.         set wordBreakPreface "$viWordBreakPreface"
  458.     }
  459.     viCmdMode
  460. }
  461.  
  462. proc setViModeOff {} {
  463.     message "Exiting vi mode"
  464.     changeMode "Text"
  465. #    # bind 'z' <z> setViMode
  466. }
  467.  
  468. proc viRedoLastCmd {} {
  469.     global viLastCmd
  470.     global subMode
  471.     if {$viLastCmd == ""} {
  472.         abortEm
  473.         return 
  474.     }
  475.     set subMode "Vi"
  476.     $viLastCmd
  477.     if {$subMode == "Insert"} { viRedoInsert }
  478. }
  479.  
  480.  
  481. # ==== SWITCH to VI Insert Mode ====
  482. proc viInsertCmd {} {
  483.     global viLastCmd
  484. #==== changeSubMode "Insert"
  485.     global subMode
  486.     global curWinId
  487.     global winNumToSubMode
  488.     set subMode "Insert"
  489.     displayMode $subMode
  490.     if {$curWinId >= 0} { set winNumToSubMode($curWinId) $subMode }
  491. #====
  492.     set viLastCmd viInsertCmd
  493.     if {[getPos] != [selEnd]} { deleteText [getPos] [selEnd] }
  494.     createTMark "viIns$curWinId" [getPos]
  495. }
  496.  
  497. proc viInsertMode {} {
  498. #==== changeSubMode "Insert"
  499.     global subMode
  500.     global curWinId
  501.     global winNumToSubMode
  502.     set subMode "Insert"
  503.     displayMode $subMode
  504.     if {$curWinId >= 0} { set winNumToSubMode($curWinId) $subMode }
  505. #====
  506.     createTMark "viIns$curWinId" [getPos]
  507. }
  508.  
  509. # END INSERT: save inserted text in insert-buffer, switch to VI Command Mode.
  510. # PROBLEM:  "viIns" mark may be gone via deletion past insert-point (~bind redo)
  511. proc viEndInsMode {} {
  512.     global viInsertText
  513. #==== changeSubMode "Vi"    (viCmdMode)
  514.     global subMode
  515.     global curWinId
  516.     global winNumToSubMode
  517.     set subMode "Vi"
  518.     displayMode $subMode
  519.     if {$curWinId >= 0} { set winNumToSubMode($curWinId) $subMode }
  520. #====
  521.     set end [getPos]
  522.     if [catch { gotoTMark "viIns$curWinId" }] { beep ; return }
  523. #    # removeTMark "viIns$curWinId"    --- auto at win close
  524.     set start [getPos]
  525.     goto $end
  526.     if {$start >= $end} { return }
  527.     set viInsertText [getText $start $end]
  528. }
  529.  
  530. proc viRedoInsert {} {
  531.     global viInsertText
  532.     if {[getPos] == [selEnd]} { insertText $viInsertText
  533.     } else { replaceText [getPos] [selEnd]  $viInsertText }
  534.     viCmdMode
  535. }
  536.  
  537.  
  538. # ==== SWITCH to vi EX Mode ====
  539. proc viExMode {} {
  540.     changeSubMode "Ex"
  541.     message "ex Mode"
  542. }
  543.  
  544.  
  545. # ==========================
  546. # ==== KEY BINDINGS    ====
  547. # ==========================
  548. # ==== BINDINGS for EMACS (deleted from original) ====
  549. # bind 'j' <e>        fillRegion
  550. # bind 'p' <e>        fillParagraph
  551. # bind '<' <se>        beginningOfBuffer
  552. # bind '>' <se>        endOfBuffer
  553. bind 'z' <z>    setViMode
  554.  
  555. # ==================================
  556. # ==== INSERT MODE BINDINGS    ====
  557. # ==================================
  558. # NOTE: "bind" to no arg will unbind (to self-insert), should have lastChar var.
  559. bind $esc    viEndInsMode    "Insert"
  560. bind $altesc    viEndInsMode    "Insert"
  561. bind $del    viDeleteCharSel    "Insert"
  562. bind $del <s>    viDeleteCharSel    "Insert"
  563. bind '\n'    carriageReturn    "Insert"
  564. bind '\n' <s>    carriageReturn    "Insert"
  565. bind '\r'    carriageReturn    "Insert"
  566. bind '\r' <s>    carriageReturn    "Insert"
  567. bind $spc    viTypeSpace    "Insert"
  568. bind $spc <s>    viTypeSpace    "Insert"
  569. bind 'z' <z>    setViModeOff    "Insert"
  570.  
  571. # ==========================
  572. # ==== VI MODE BINDINGS    ====
  573. # ==========================
  574. #    ESC==abort (reset so not void redo "viIns"), ' '==special
  575. #    DEL==backwardChar (vs. backSpace)
  576. bind $esc    abortEm        "Vi"
  577. bind $altesc    abortEm        "Vi"
  578. bind $del    viDeleteCharSel    "Vi"
  579. bind $del <s>    viDeleteCharSel    "Vi"
  580. bind '\n'    nextLine    "Vi"
  581. bind '\n' <s>    nextLine    "Vi"
  582. bind '\r'    nextLine    "Vi"
  583. bind '\r' <s>    nextLine    "Vi"
  584. bind $spc    forwardChar    "Vi"
  585. bind $spc <s>    forwardChar    "Vi"
  586. bind 'i'    viInsertCmd    "Vi"
  587. bind ':' <s>    viExMode    "Vi"
  588. bind 'z' <z>    setViModeOff    "Vi"
  589. bind '\'    startEscape    "Vi"
  590. bind '\' <e>    evalCommand    "Vi"
  591.  
  592. bind 'a'    viAdd        "Vi"
  593. bind 'a' <s>    viAddEnd    "Vi"
  594. bind 'b'    viBackwardWord    "Vi"
  595. bind 'c'    prefixChar    "Vi"
  596. bind 'd'    prefixChar    "Vi"
  597. bind 'e'    viEndOfWord    "Vi"
  598. bind 'g'    currentPosition    "Vi"
  599. bind 'h'    backwardChar    "Vi"
  600. bind 'j'    nextLine    "Vi"
  601. bind 'j' <s>    viJoinLine    "Vi"
  602. bind 'k'    previousLine    "Vi"
  603. bind 'l'    forwardChar    "Vi"
  604. bind 'm'    setNamedMark    "Vi"
  605. bind 'n'    viSearch    "Vi"
  606. bind 'o'    viOpenLine    "Vi"
  607. bind 'o' <s>    viOpenLineB    "Vi"
  608. bind 'p'    viYank        "Vi"
  609. bind 'r'    viSubChar    "Vi"
  610. bind 's'    viSubChar    "Vi"
  611. bind 't'    viEndOfWord    "Vi"
  612. bind 'u'    undo        "Vi"
  613. bind 'v'    viBackwardWord    "Vi"
  614. bind 'w'    viForwardWord    "Vi"
  615. bind 'x'    viDeleteCharX    "Vi"
  616. bind 'y'    yank        "Vi"
  617. bind 'z'    insertToTop    "Vi"
  618. bind '0'    beginningOfLine    "Vi"
  619. bind '%' <s>    balance        "Vi"
  620. bind '$' <s>    endOfLine    "Vi"
  621. bind $quot    gotoMark    "Vi"
  622. bind '/'    viSearchForward    "Vi"
  623. bind '?' <s>    viSearchBackward "Vi"
  624. #    ' marks (^' for '')
  625. #    m: named mark (^m for set current mark)
  626. #    n: repeatSearchForward (redo commands (persistent))
  627. #    d: <x>  w or $    
  628. #    c: <e>  w or $        
  629.  
  630. # ==================================================================
  631. # ==== VI MODE BINDINGS -- PERMANENT (prefixed) SETTINGS    ====
  632. # ==================================================================
  633. bind 'a' <z>    beginningOfLine    "Vi"
  634. bind 'b' <z>    pageBack    "Vi"
  635. bind 'e' <z>    endOfLine    "Vi"
  636. bind 'f' <z>    pageForward    "Vi"
  637. bind 'g' <z>    currentPosition    "Vi"
  638. bind 'h' <z>    backwardChar    "Vi"
  639. bind 'j' <z>    nextLine    "Vi"
  640. bind 'k' <z>    previousLine    "Vi"
  641. bind 'l' <z>    forwardChar    "Vi"
  642. bind 'n' <z>    scrollDownLine    "Vi"
  643. bind 'p' <z>    scrollUpLine    "Vi"
  644. bind 'q' <z>    keyAscii    "Vi"
  645. bind 'r' <z>    fillParagraph    "Vi"
  646. bind 's' <z>    viSelectToSaved    "Vi"
  647. #  REGION SELECT/EDIT
  648. bind 't' <z>    viEndOfWord    "Vi"
  649. bind 'u' <z>    undo        "Vi"
  650. bind 'v' <z>    viBackwardWord    "Vi"
  651. bind 'w' <z>    viForwardWord    "Vi"
  652. bind 'y' <z>    viYank        "Vi"
  653. bind '1' <z>    beginningOfBuffer "Vi"
  654. bind '4' <z>    endOfBuffer    "Vi"
  655. bind '5' <z>    balance        "Vi"
  656. bind '.'    viRedoLastCmd    "Vi"
  657. #    . : redo command (history sensitive)
  658.  
  659. # ==== DELETE MODE MODIFIERS (d prefix)
  660. bind 'd' <z>    prefixChar    "Vi"
  661. bind 'x' <D>    cut        "Vi"
  662. bind 'c' <D>    copy        "Vi"
  663. bind 'v' <D>    paste        "Vi"
  664. bind 'w' <D>    viDeleteWord    "Vi"
  665. bind 'd' <D>    viDeleteLine    "Vi"
  666. bind '$' <sD>    viDeleteLineEnd    "Vi"
  667. bind 'L' <sD>    viDeletePage    "Vi"
  668. bind 'R' <sD>    viDeleteRest    "Vi"
  669. bind 'B' <sD>    viDeleteAllBefore "Vi"
  670.  
  671. # ==== CHANGE MODE MODIFIERS (c prefix)
  672. bind 'c' <z>    prefixChar    "Vi"
  673. bind 'w' <C>    viChangeWord    "Vi"
  674. bind '$' <Cs>    viChangeLine    "Vi"
  675.     
  676. # === MARK MODE MODIFIERS (^') ====
  677. bind $quot <z> exchangePointAndMark "Vi"
  678. bind 'm' <z> setMark        "Vi"
  679. bind '^' <z> exchangePointAndMark "Vi"
  680. bind '@' <z> setMark        "Vi"
  681.  
  682. # ==========================
  683. # ==== EX MODE BINDINGS    ====
  684. # ==========================
  685. bind $esc    viCmdMode    "Ex"
  686. bind $altesc    viCmdMode    "Ex"
  687. bind $del    viDeleteCharB    "Ex"
  688. bind $del <s>    viDeleteCharB    "Ex"
  689. bind '\n'    viCmdMode    "Ex"
  690. bind '\n' <s>    viCmdMode    "Ex"
  691. bind '\r'    viCmdMode    "Ex"
  692. bind '\r' <s>    viCmdMode    "Ex"
  693. bind 'z' <z>    setViModeOff    "Ex"
  694.  
  695. bind 'c'    copy        "Ex"
  696. bind 'c' <s>    copyNamedClipboard "Ex"
  697. bind 'g'    gotoLine    "Ex"
  698. bind 'i'    viCopyAB    "Ex"
  699. bind 'm'    viMoveAB    "Ex"
  700. bind 'n'    new        "Ex"
  701. bind 'p'    viCopySelWind    "Ex"
  702. bind 'q'    killWindow    "Ex"
  703. bind 'r'    insertFile    "Ex"
  704. bind 's'    saveAs        "Ex"
  705. bind 's' <s>    viSaveSelection    "Ex"
  706. bind 'v'    paste        "Ex"
  707. bind 'v' <s>    pasteNamedClipboard "Ex"
  708. bind 'w'    save        "Ex"
  709. bind 'x'    cut        "Ex"
  710. bind 'x' <s>    cutNamedClipboard "Ex"
  711. bind '1'    beginningOfBuffer "Ex"
  712. bind '$' <s>    endOfBuffer    "Ex"
  713. # ***************************************************************************
  714. #                 END of VI section.
  715. # ***************************************************************************
  716.  
  717. #===================================
  718. # ==== EMACS MODE BINDINGS    ====
  719. #===================================
  720.  
  721. #======================== END NUMLINES 672 ====================================
  722.